/*************************************************************************
	> File Name: 001.SequenceList.c
	> Author: Maureen 
	> Mail: Maureen@qq.com 
	> Created Time: 二  8/31 11:48:09 2021
 ************************************************************************/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

//顺序表结构定义
typedef struct Vector {
    int *data;  //连续的存储空间
    int size; //顺序表可容纳的总元素个数
    int length; //已经存储的元素个数
} Vec;

/*
 * 顺序表的初始化
 */
Vec *init(int n) {
    Vec *v = (Vec *)malloc(sizeof(Vec)); 
    v->data = (int *)malloc(sizeof(int) * n);
    v->size = n;
    v->length = 0;
    return v;
}


/*
 * 顺序表的插入
 */
int insert(Vec *v, int val, int ind) {
    if (v == NULL) //顺序表不存在
        return 0;
    if (ind < 0 || ind > v->length) //插入的位置不合法
        return 0;
    if (v->length == v->size) //顺序表中的元素已经到达了最大容量
        return 0;
    for (int i = v->length; i > ind; i--) { //移动要插入的位置及其之后位置的元素，从最后的元素开始移动
        v->data[i] = v->data[i - 1];
    }
    v->data[ind] = val;
    v->length++;
    return 1;
}


/*
 * 顺序表的删除
 */
int erase(Vec *v, int ind) {
    if (v == NULL) //判断顺序表是否存在
        return 0;
    if (ind < 0 || ind >= v->length) //ind不合法
        return 0;
    for (int i = ind + 1; i < v->length; i++) {
        v->data[i - 1] = v->data[i];
    }
    v->length--;
    return 1;
}


/*
 * 顺序表的销毁
 */
void clear(Vec *v) {
    if (v == NULL) return ; //判断顺序表是否存在
    //销毁malloc申请的空间
    free(v->data); //释放数据区
    free(v); //销毁顺序表
    return ;
}


/*
 * 顺序表元素的输出
 */
void output(Vec *v) {
    if (v == NULL) return ;
    printf("Vector : [");
    for (int i = 0; i < v->length; i++) {
        i && printf(", ");
        printf("%d", v->data[i]);
    }
    printf("]\n");
    return ;
}


int main() {
    srand(time(0)); //设置随机种子
    #define max_op 20 
    Vec *vec = init(max_op);
    for (int i = 0; i < max_op; i++) {
        int val = rand() % 100;
        int ind = rand() % (vec->length + 3) - 1; //随机生成的下标，使得其可能为负数，可能为大于v->length的情况，使得测试更全面
        int op = rand() % 4;
        switch (op) {
            case 0:
            case 1:
            case 2: {
                printf("insert %d at %d to Vector, result = %d\n", val, ind, insert(vec, val, ind));
            } break;
            case 3: {
                printf("erase an item at %d from Vector, result = %d\n", ind, erase(vec, ind));
            } break;
        }
        output(vec);
        printf("\n");
    }
    clear(vec);
    #undef max_op 

    return 0;
}
